﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using nsadv.Statistic.Domain;

namespace nsadv.Statistic.Web.ViewModels
{
	[CustomValidation(typeof(UserModelValidator), "ValidateUserModel")]
	public class UserModel : BaseModel
	{
		public string Id { get; set; }

		[Required(ErrorMessage = "Имя пользователя должно быть указано.")]
		public string Name { get; set; }

		[Required(ErrorMessage = "Пароль пользователя должен быть указан.")]
		public string Password { get; set; }

		[Required(ErrorMessage = "Тип пользователя должен быть указан.")]
		public string RoleName { get; set; }

		public string PlaceId { get; set; }

		public string AdvertiserId { get; set; }

		public List<SelectListItem> Roles { get; private set; }

		public List<SelectListItem> Advertisers { get; private set; }

		public List<SelectListItem> Places { get; private set; }

		public UserModel()
		{
			Roles = new List<SelectListItem>();

			foreach (var roleName in Enum.GetNames(typeof(UserRole)))
			{
				var role = (UserRole)(Enum.Parse(typeof(UserRole), roleName));
				Roles.Add(new SelectListItem { Text = UserRoleNamesMap(role), Value = roleName });
			}
		}

		public static string UserRoleNamesMap(UserRole role)
		{
			if (UserRoleNameMap.ContainsKey(role))
			{
				return UserRoleNameMap[role];
			}
			throw new ArgumentException(string.Format("Для роли типа {0} не определено имя.", role), "role");
		}

		private static readonly Dictionary<UserRole, string> UserRoleNameMap = new Dictionary<UserRole, string>
			               	{
			               		{UserRole.None, "Нет"},
			               		{UserRole.Root, "Root"},
			               		{UserRole.Place, "Рекламная площадка"},
			               		{UserRole.Advertiser, "Рекламное агентство/Рекламодатель"}
			               	};

		public void FillClassifiersData(IEnumerable<Advertiser> advertisers, IEnumerable<Place> places)
		{
			Advertisers = new List<SelectListItem> { new SelectListItem { Text = string.Empty, Value = "-1" } };
			Advertisers.AddRange(from advertiser in advertisers
								 select new SelectListItem
								        	{
								        		Text = advertiser.Name, 
												Value = advertiser.Id, 
												Selected = AdvertiserId == advertiser.Id
								        	});

			Places = new List<SelectListItem> { new SelectListItem { Text = string.Empty, Value = "-1" } };
			Places.AddRange(from place in places
							select new SelectListItem
							       	{
							       		Text = place.Name, 
										Value = place.Id, 
										Selected = PlaceId == place.Id
							       	});
		}

		public class UserModelValidator
		{
			public static ValidationResult ValidateUserModel(UserModel model)
			{
				var userRole = (UserRole)(Enum.Parse(typeof(UserRole), model.RoleName));

				if (userRole == UserRole.Place && (string.IsNullOrWhiteSpace(model.PlaceId) || model.PlaceId == "-1"))
					return new ValidationResult("Если выбрана роль 'Рекламная площадка', то необходимо заполнить поле 'Рекламная площадка'.");
				if (userRole == UserRole.Advertiser && (string.IsNullOrWhiteSpace(model.AdvertiserId) || model.AdvertiserId == "-1"))
					return new ValidationResult("Если выбрана роль 'Рекламодатель', то необходимо заполнить поле 'Рекламодатель'.");

				return ValidationResult.Success;
			}
		}

	}
}